home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack#3b.sfx / hack#3-3.txt next >
Text File  |  1990-02-12  |  38KB  |  828 lines

  1. ╟EO╨AINT ╞ILE ╞ORMAT
  2. --------------------
  3. BY ┬RUCE ╓RIELING (BVRIELING@UNDERGRAD.MATH.WATERLOO.EDU)
  4.  
  5. ╟EO╨AINT IS AN EXCELLENT GRAPHICS PROGRAM WRITTEN FOR THE ╟┼╧╙ ENVIRONMENT. ╔TS
  6. DISK ACCESS IS RELATIVELY QUICK, COMPARED IT TO WHAT A COMPARABLE PROGRAM WOULD
  7. DO ON A NON-╟┼╧╙ EQUIPPED ├64. ╨ART OF THIS ACCOMPLISHMENT CAN BE ATTRIBUTED TO
  8. THE DISK╘URBO THAT IS AN INTEGRAL PART OF ╟┼╧╙. ╚OWEVER, THE SPECIAL ╟EO╨AINT
  9. FILE-SAVING SCHEME DESERVES SOME OF THE CREDIT.
  10.  
  11.  
  12. ╓╠╔╥
  13. ----
  14.  
  15. ╟EO╨AINT FILES ARE ALWAYS STORED IN ╓ARIABLE ╠ENGTH ╔NDEXED ╥ECORDING FILES.
  16. ╓╠╔╥ FILES OFFER ADVANTAGES NOT AVAILABLE WITHOUT ╟┼╧╙. ╟ENERALLY SPEAKING, ╓╠╔╥
  17. IS THE ULTIMATE IN ╥┼╠┴╘╔╓┼ FILES.
  18.  
  19. ╘HE FORMAT OF A ╓╠╔╥ FILE IS NOT THAT DIFFICULT TO FIGURE OUT. ╫HILE IN A
  20. REGULAR ├64 FILE, THE TWO BYTES DIRECTLY FOLLOWING THE ╞╔╠┼╘┘╨┼ BYTE IN THE
  21. DIRECTORY WOULD POINT TO THE DATA FILE FOLLOWING, ╓╠╔╥ FILES USE THESE TWO BYTES
  22. TO POINT TO A ╓╠╔╥ ╚┼┴─┼╥ ┬╠╧├╦ (DON'T CONFUSE THE ╓╠╔╥ ╚┼┴─┼╥ BLOCK WITH THE
  23. ╔╬╞╧ BLOCK). ╘HE FIRST TWO BYTES OF THIS BLOCK ARE $00/╞╞, AS THE HEADER BLOCK
  24. IS A ═┴╪╔═╒═ OF ONE BLOCK LONG. (╘HIS IS WHY WHEN YOU ╓┴╠╔─┴╘┼ A ╟┼╧╙ DISK FROM
  25. ├64 MODE, ╟EO╨AINT PICTURES ARE LOST. ╧NLY THE HEADER BLOCK IS RECOGNISED AS
  26. BEING PART OF THE FILE. ╘HE REST OF THE PICTURE GETS DEALLOCATED IN THE ┬┴═).
  27. ╘HE REMAINING 254 BYTES IN THE BLOCK ARE DIVIDED INTO 127 2-BYTE POINTERS TO
  28. TRACKS/SECTORS ON THE DISK. ╘HESE POINTERS POINT TO THE INDIVIDUAL RECORDS OF
  29. THE ╓╠╔╥ FILE, WHICH MAY BE ┴╬┘ NUMBER OF BLOCKS LONG. ╘HE ╓╠╔╥ TRACK/SECTOR
  30. POINTERS IN THE ╓╠╔╥ HEADER BLOCK ONLY POINT TO THE ╞╔╥╙╘ BLOCK OF THE CHAIN.
  31. ╞ROM THEN ON, THE SECTORS CHAIN THEMSELVES TOGETHER USING THE NORMAL FORMAT IE.
  32. THE FIRST TWO BYTES OF EACH BLOCK POINT TO THE FOLLOWING BLOCK.
  33.  
  34. ┴ SAMPLE ╟EO╨AINT ╓╠╔╥ HEADER MIGHT LOOK LIKE THIS:
  35.  
  36. 0000:00 ╞╞ 03 11 03 05 03 01 ........
  37. 0008:04 03 00 ╞╞ 00 ╞╞ 00 ╞╞ ........
  38. 0010:04 07 00 00 00 00 00 00 ........
  39.  ETC....
  40.  
  41. ╘HE FIRST TWO BYTES, $00/╞╞, TELL THE DRIVE THAT THIS IS THE LAST (AND ONLY)
  42. BLOCK IN THIS ╓╠╔╥ ╚┼┴─┼╥ ╙┼├╘╔╧╬ (WILL NEVER BE MORE THAN 1 BLOCK, AS WAS
  43. MENTIONED EARLIER). ╘HE NEXT PAIR OF BYTES, $03/11, POINTS TO THE FIRST ╓╠╔╥
  44. RECORD. ╘HE NEXT TWO, $03/05, POINT TO THE SECOND RECORD.
  45.  
  46. ┘OU WILL NOTICE THAT 5TH RECORD CONTAINS THE VALUES $00/╞╞. ╘HIS MEANS THAT FOR
  47. THIS RECORD, THERE IS NO PICTURE DATA. ╫E WILL GET INTO EXACTLY WHAT THE DATA
  48. HELD IN THE RECORDS MEAN IN A MINUTE. ╘HE $00/╞╞ ENTRIES INDICATE AN EMPTY
  49. RECORD. ╞INALLY, THE 9TH ENTRY, $00/00 INDICATES THE END OF THE ╟EO╨AINT FILE.
  50. ╘HERE IS NO MORE DATA BEYOND THIS POINT.
  51.  
  52. ╧NE NOTE SHOULD BE MADE. ╟EO╨AINT IS NOT ALWAYS CONSISTENT IN ITS HANDLING OF
  53. THE DATA IN A HEADER BLOCK. ╙OMETIMES, IT WILL SHOW QUITE A FEW $00/╞╞
  54. COMBINATIONS BEFORE FINALLY TERMINATING WITH A $00/00. ╫HEN READING THE FILE,
  55. ╔ ALWAYS READ THE ENTIRE HEADER, AS ╔ DON'T TRUST THE END OF FILE METHOD
  56. MENTIONED ABOVE. ╩UST REMEMBER THAT ANY TRACK/SECTOR LINK THAT DOES NOT CONTAIN
  57. $00/╞╞ OR $00/00 IS A VALID RECORD, WITH PICTURE DATA.
  58.  
  59.  
  60. ╠AYOUT ON ╙CREEN
  61. ----------------
  62.  
  63. ╟┼╧╙ ORIENTS THE DATA IN A ╟EO╨AINT FILE SLIGHTLY DIFFERENTLY THAN IN A
  64. ╨HOTO╙CRAP OR AN ╔CON. ┴ PHOTOSCRAP STORES THE BYTES CORROSPONDING TO A SCREEN
  65. WHICH LOOKS LIKE THIS:
  66.  
  67. 001 002 003 004 005 ....0012
  68. 013 014 015 016 017 ....0024
  69.  
  70. ├ONSECUTIVE BYTES ARE PLACED ┬┼╙╔─┼ EACH OTHER. ╚OWEVER, IF YOU ARE AT ALL
  71. FAMILIAR WITH THE LAYOUT OF A ├64 HI-RES SCREEN, YOU WILL KNOW THIS IS VERY
  72. DIFFERENT FROM THE LAYOUT THAT THE ╓╔├ CHIP SEES DATA. ╟EO╨AINT USES A FORMAT
  73. IDENTICAL TO THE ╓╔├ CHIP LAYOUT ON SCREEN.
  74.  
  75. ╟EO╨AINT PICTURES ARE STORED IN THE FOLLOWING FORMAT:
  76.  
  77. 001 009 017 025 033 .....  313
  78. 002 010 018 026 034 .....  314
  79. 003 011 019 027 035 .....  315
  80. 004 012 020 028 036 .....  316
  81. 005 013 021 029 037 .....  317
  82. 006 014 022 030 038 .....  318
  83. 007 015 023 031 039 .....  319
  84. 008 016 024 032 040 .....  320
  85.  
  86. 321 329 .....
  87. 322 330 .....
  88. 323 331 .....
  89. 324 332 .....
  90. 325 333 .....
  91. 326 334 .....
  92. 327 335 .....
  93. 328 336 .....
  94.  
  95. ┴S YOU CAN SEE, THIS IS VERY DIFFERENT FROM THE ╨HOTO╙CRAP FORMAT. ├ONSECUTIVE
  96. BYTES ARE ╬╧╘ STORED ON THE SCREEN BESIDE EACH OTHER. ╥ATHER, THEY ARE STORED
  97. UNDERNEATH EACH OTHER INTO GROUPS OF 8 BYTES. ╘HIS MAKES MOVING THE DATA FROM
  98. THE DISK ONTO THE SCREEN THAT MUCH FASTER, AS THE DECOMPACTED BYTES CAN JUST BE
  99. STORED ON THE SCREEN AFTER EACH OTHER. ╧F COURSE, THIS MAKES PORTING ╟┼╧╙ PICS
  100. TO THE 128'S ╓─├ THAT MUCH MORE DIFFICULT, AS THE ╓─├ CONFORMS TO THE
  101. ╨HOTO╙CRAP FORMAT.
  102.  
  103.  
  104. ├OMPRESSION ═ETHOD
  105. ------------------
  106.  
  107. ╟┼╧╙ USES AN EXCELLENT COMPRESSION METHOD TO STORE FILES ON DISK. ┘OU MAY HAVE
  108. NOTICED THAT NEARLY EMPTY PICTURES ON DISK CONSUME VERY LITTLE DISK SPACE. ╘HIS
  109. CAN BE CREDITED TO ╟EO╨AINT'S SMART COMPRESSION TECHNIQUES.
  110.  
  111. ┬ASICALLY, THE FORMAT OF THE COMPRESSION HAS ONE ├╧══┴╬─ BYTE FOLLOWED BY ONE
  112. OR MORE ─┴╘┴ BYTES. ╘HE ├╧══┴╬─ BYTE TELLS ╟┼╧╙ WHAT TO DO WITH FOLLOWING ─┴╘┴
  113. BYTES. ╘HERE ARE 4 COMMANDS FOR COMPRESSION:
  114.  
  115. 1) ╔F THE ├╧══┴╬─ BYTE IS LESS THAN 64, THIS INDICATES THAT THERE ARE '├╧══┴╬─'
  116.    MANY ─┴╘┴ BYTES FOLLOWING THAT ARE TO BE TAKEN AS INDIVIDUAL BYTES. ╘HIS IS
  117.    THE LEAST EFFECTIVE METHOD OF COMPRESSION, AS NO COMPRESSION TAKES PLACE.
  118.  
  119. 2) ╔F THE ├╧══┴╬─ BYTE RANGES FROM 65 TO 127, THEN THIS IS A SPECIAL TYPE OF
  120.    COMPRESSION. ╞IRST OF ALL, THE NEXT 8 BYTES IN THE FILE ARE READ IN AS ─┴╘┴.
  121.    ╘HIS ─┴╘┴ IS USED TO MAKE AN 8*8 'STAMP'. ╙ECONDLY, THE AMOUNT OF TIMES TO
  122.    'STAMP' THIS 8*8 SQUARE IS CALCULATED (├╧══┴╬─ ┴╬─ 63). ╘HEN, THE STAMPING
  123.    IS DONE. '╙TAMPING' SOUNDS MORE DIFFICULT THAT IT REALLY IS. ╫HAT IT BOILS
  124.    DOWN TO, IS REPEATING THE 8 BYTE ─┴╘┴ STAMP '├╧══┴╬─ ┴╬─ 63'
  125.    TIMES.
  126.  
  127. 3) ╔F THE ├╧══┴╬─ BYTE IS 129 OR GREATER, THEN THE FOLLOWING ─┴╘┴ BYTE IS
  128.    REPEATED '├╧══┴╬─ ┴╬─ 127' TIMES. ╘HIS IS DIFFERENT FROM #1, AS ONLY 1 ─┴╘┴
  129.    BYTE IS CALLED IN, AND SIMPLY REPEATED. #1 CALLED IN '├╧══┴╬─' MANY ─┴╘┴
  130.    BYTES.
  131.  
  132. 4) ╔F THE ├╧══┴╬─ BYTE IS ┌┼╥╧, WE HAVE REACHED THE END OF THE ╓╠╔╥ RECORD FOR
  133.    THE ╟EO╨AINT PICTURE.
  134.  
  135. ╔T SHOULD BE NOTED THAT THE ├╧══┴╬─ BYTE WILL ╬┼╓┼╥ BE 64 OR 128. ╔F IT IS,
  136. THERE HAS BEEN AN ERROR.
  137.  
  138.  
  139. ╞ORMAT OF ─ATA ┴FTER ─ECOMPACTING
  140. ---------------------------------
  141.  
  142. ┴FTER THE DATA HAS BEEN DECOMPACTED, IT REMAINS TO BE PLACED ON THE SCREEN. ┼ACH
  143. ╓╠╔╥ RECORD HOLDS 16 SCANLINES OF DATA, OR 2 CHARACTER LINES (DIFFERENT WAYS OF
  144. LOOKING AT THE SAME THING).
  145.  
  146. ╘HE FORMAT OF THE DATA IS AS FOLLOWS:
  147.  
  148.      ╞IRST, THERE IS 640 BYTES OF PICTURE DATA, COMPRISING THE FIRST CHARACTER
  149.      LINE (8 SCANLINES). ╥EMEMBER, ╟EO╨AINT PICTURES ARE 640 PIXELS ACROSS. 640
  150.      PIXELS WORKS OUT TO 80 BYTES. ┴ CHARACTER LINE IS 8 PIXELS DEEP, SO 80*8
  151.      COMES TO 640 BYTES.
  152.  
  153.      ╘HESE BYTES ARE FOLLOWED BY THE 640 BYTES FOR THE SECOND CHACACTER LINE
  154.      (NEXT 8 SCANLINES). ╘HIS IS FOLLOWED BY 8 GARBAGE BYTES THAT ACCIDENTALY
  155.      WORKED THEMSELVES INTO THE ORIGINAL ╟EO╨AINT DESIGN. ╘HEY SHOULD BE SET TO
  156.      ZERO.
  157.  
  158.      ╞INALLY, TWO SETS OF 80 BYTES OF COLOUR DATA FOLLOW. ╘HE FIRST SET
  159.      COMPRISES THE COLOUR FOR THE FIRST LINE, THE SECOND 80 BYTES FOR THE SECOND
  160.      LINE. ╘O WRAP THINGS UP, THE ╓╠╔╥ RECORD IS TERMINATED BY A ZERO BYTE.
  161.  
  162.      ╘HE NEXT ╓╠╔╥ RECORD WILL HOLD THE DATA FOR THE ╬┼╪╘ 16 SCANLINES, AND SO
  163.      ON.
  164.  
  165.  
  166. ├ONCLUSION
  167. ----------
  168.  
  169. ╘HAT ABOUT WRAPS UP THIS DISCUSSION ON ╟EO╨AINT FORMAT FOR FILES. ╫E'VE
  170. DISCUSSED THE FORMAT OF ╓╠╔╥ FILES ON DISK, LAYOUT OF PICTURE DATA ON SCREEN,
  171. COMPRESSION METHODS USED IN ╟EO╨AINT FILES, AND THE FORMAT OF THE DATA ONCE
  172. DECOMPACTED. ╔ HOPE THIS INFORMATION WILL COME IN HANDY FOR SOMEONE.
  173.  
  174. ==============================================================================
  175. ╥ASTERS - ╫HAT ╘HEY ┴RE AND ╚OW TO ╒SE ╘HEM
  176. BY ┬RUCE ╓RIELING - (BVRIELING@UNDERGRAD.MATH.WATERLOO.EDU)
  177.  
  178. ┴NYONE WHO HAS FIDDLED AROUND WITH INTERRUPTS ON THE ├OMMODORE 64 HAS
  179. UNDOUBTEDLY HEARD AT ONE TIME OR ANOTHER OF THE CONCEPT OF RASTERS BEING
  180. MENTIONED. ╥ASTERS ARE THE 'ULTIMATE' ACHIEVEMENT OF INTERRUPT PROGRAMMING, OR
  181. SO THEY SAY. ╫HAT IS A RASTER? ┴ND HOW DOES ONE GO ABOUT WRITING A PROGRAM TO
  182. USE THEM?
  183.  
  184. ╧VERVIEW OF WHAT ╔NTERRUPTS ARE ALL ABOUT
  185. -----------------------------------------
  186.  
  187. ┴ RASTER IS SORT FORM FOR THE CONCEPT OF A 'RASTER INTERRUPT'. ┬EFORE
  188. GOING INTO RASTERS, PERHAPS A BRIEF REVIEW OF INTERRUPTS IS IN ORDER.
  189.  
  190. ╔NTERRUPTS ARE EVENTS GENERATED BY THE ├╔┴ TIMER IN THE ├64 TO PERFORM CERTAIN
  191. TASKS. 60 TIMES A SECOND, THE ├╔┴ CHIP SIGNALS AN INTERRUPT IS DUE TO BE
  192. PROCESSED (IE. THE INTERRUPT TIMER TIMED OUT). ╘HIS CAUSES THE 6510 ├╨╒ TO STOP
  193. EXECUTING THE CURRENT PROGRAM, SAVE THE REGISTERS ON THE STACK, AND BEGIN TO
  194. EXECUTE THE INTERRUPT CODE. ╙OME OF THE THINGS WHICH GET DONE DURING AN
  195. INTERRUPT INCLUDE THE KEYBOARD SCAN, AND UPDATING ╘╔ (THE SOFTWARE CLOCK). ╫HEN
  196. THE INTERRUPT CODE IS FINISHED, AN ╥╘╔ INSTRUCTION IS EXECUTED, WHICH BRINGS
  197. THE INTERRUPT'S EXECUTION TO A HALT. ╘HE REGISTERS ARE RETRIEVED FROM THE STACK,
  198. AND THE CURRENT PROGRAM IN MEMORY CONTINUES TO EXECUTE ONCE AGAIN. ╔T WILL
  199. CONTINUE TO DO SO UNTIL THE NEXT INTERRUPT OCCURS, ABOUT 1/60 OF A SECOND LATER.
  200.  
  201. ╘HE ABOVE IS WHAT HAPPENS IN A NORMAL ├64 (THE ├128 FOLLOWS THE SAME IDEA, BUT
  202. MORE EVENTS OCCUR DURING A ├128 INTERRUPT). [┼D. ╬OTE: ╔N ADDITION, THE ├=128
  203. GENERATES ITS INTERRUPTS VIA A SCREEN RASTER INSTEAD OF THE ├╔┴ CHIP.]
  204.  
  205. ╚OWEVER, YOU CAN CHANGE THE NORMAL COURSE OF EVENTS, AND CAUSE SOME CODE OF YOUR
  206. DESIGN TO BE ADDED TO THE NORMAL LIST OF EVENTS WHICH OCCUR EVERY INTERRUPT.
  207. ╙OME OF THE SIMPLE FAVOURITES INCLUDE FLASHING THE BORDER 60 TIMES PER SECOND.
  208. (╬OTE THAT WE HAVE NOT BEGUN THE TOPIC OF RASTERS YET; THIS HAS NOTHING TO DO
  209. WITH RASTERS. ╘HAT DISCUSSION BEGINS AT THE NEXT HEADING.)
  210.  
  211. ╚OW DO YOU CHANGE THE INTERRUPT'S NORMAL COURSE OF ACTION? ╔T'S RATHER SIMPLE.
  212. ╘HE ├64 CONTAINS AN INTERRUPT ╓┼├╘╧╥ AT LOCATIONS 788/9 WHICH IS 'JUMPED
  213. THROUGH' BEFORE THE ╦ERNAL ╥OM GETS A CHANCE TO EXECUTE ITS CODE. ╔F YOU CHANGE
  214. THIS VECTOR TO POINT TO ┘╧╒╥ CODE, AND MAKE THE END OF YOUR CODE POINT TO THE
  215. NORMAL ╦ERNAL LOCATION (WHERE THE INTERRUPT NORMALLY WOULD HAVE JUMPED TO,
  216. $┼┴31), AND YOU ARE CAREFUL NOT TO STEP ON ANYTHING, YOUR CODE WILL BE EXECUTED
  217. 60 TIMES PER SECOND.
  218.  
  219. ┴N EXAMPLE IS IN ORDER:
  220.  
  221. ; FLASHER
  222. ;
  223. ; THIS PROGRAM CAUSES THE BORDER TO FLASH 60 TIMES PER SECOND
  224. ;
  225. SETUP = *
  226.  
  227. SEI                           ; DISABLE INTERRUPTS
  228. LDA #<INTCODE                 ; GET LOW BYTE OF TARGET ROUTINE
  229. STA 788                       ; PUT INTO INTERRUPT VECTOR
  230. LDA #>INTCODE                 ; DO THE SAME WITH THE HIGH BYTE
  231. STA 789
  232. CLI                           ; RE-ENABLE INTERRUPTS
  233. RTS                           ; RETURN TO CALLER
  234.  
  235. INTCODE = *
  236.  
  237. INC $D020                     ; CHANGE BORDER COLOUR
  238. JMP $EA31                     ; EXIT BACK TO ROM
  239.  
  240.  
  241. ╘HE ABOVE IS AN EXAMPLE OF A VERY SIMPLE INTERRUPT ROUTINE. ╔F YOU WERE TO
  242. ASSEMBLE IT WITH AN ASSEMBLER, AND ╙┘╙ TO THE ╙┼╘╒╨ ROUTINE, YOU WOULD SEE YOUR
  243. BORDER FLASH 60 TIMES PER SECOND.
  244.  
  245. ┘OU WILL NOTICE THE ╙┼╔ AND ├╠╔ MACHINE LANGUAGE INSTRUCTIONS USED ABOVE. ╘HEY
  246. ARE VERY IMPORTANT. ╫E DON'T WANT AN INTERRUPT OCCURRING IN BETWEEN THE ╙╘┴ 788
  247. AND THE ╙╘┴ 789 INSTRUCTIONS.
  248.  
  249. ╘HINK WHAT WOULD HAPPEN IF ONE DID: 788 WOULD HAVE BEEN MODIFIED, BUT 789 WOULD
  250. STILL BE POINTING TO THE HIGH BYTE OF THE ╦ERNAL ADDRESS. ╥ESULT: THE INTERRUPT
  251. WOULD HAVE JUMPED TO HEAVEN KNOWS WHERE. ┘OU CAN BE VIRTUALLY GUARANTEED THAT
  252. IT WOULD ╬╧╘ BE POINTING TO A VALID PIECE OF INTERRUPT CODE. ┘OUR MACHINE WOULD
  253. CRASH. ╘HE ╙┼╔ INSTRUCTION TURNS INTERRUPTS ╧╞╞, SO THAT THERE IS NO DANGER OF
  254. AN INTERRUPT OCCURRING DURING EXECUTION OF THE FOLLOWING ROUTINE. ╘HE ├╠╔ TURNS
  255. THEM BACK ON. ╔F YOU FORGET TO TURN THEM BACK ON, AND ACCIDENTALLY LEAVE THEM
  256. OFF, YOUR KEYBOARD WILL FREEZE WHEN YOU RETURN TO BASIC, AND YOUR MACHINE WILL
  257. SEEM TO LOCK UP.
  258.  
  259. ╘HE ABOVE WAS A VERY SIMPLE EXAMPLE. ╘HERE ARE MANY USEFUL THINGS WHICH CAN ALSO
  260. BE DONE ON AN INTERRUPT. ╔ HAVE SEEN CODE WHICH PLAYED MUSIC IN THE BACKGROUND
  261. OF A RUNNING ┬ASIC PROGRAM (IT PLAYED THE POPULAR .═╒╙ FILES). ╟┼╧╙ USES
  262. INTERRUPTS EXTENSIVELY TO CONTROL THE POINTING OF THE MOUSE, AND TO TRIGGER
  263. EVENTS. ╔NTERRUPTS ARE POWERFUL BEASTS, AND THE FOLLOWING CONCEPT CONCERNING
  264. RASTER INTERRUPTS SPECIFICALLY IS A PARTICULARLY USEFUL ANIMAL FOR SOME PEOPLE.
  265.  
  266.  
  267. ╘HE ╥ASTER
  268. ----------
  269.  
  270. ┴ RASTER IS A LOOSELY USED TERM. ╔T REFERS TO AN INTERRUPT THAT IS TRIGGERED
  271. WHEN THE RAY GUN ON THE BACK OF YOUR MONITOR DRAWS A CERTAIN LINE ON THE VIDEO
  272. SCREEN. ╘HERE ARE MANY DIFFERENT SOURCES WHICH CAN CAUSE AN INTERRUPT. ┘OU ARE
  273. NOT LIMITED TO WHAT THE ├╔┴ CHIP CAN DO. ╥ASTERS DEPEND ON INTERRUPTS
  274. SPECIFICALLY GENERATED BY THE ╓╔─┼╧ CHIP. ┘OU COULD MAKE THIS INTERRUPT CHANGE
  275. THE BORDER COLOUR OF THE SCREEN BELOW A CERTAIN SCREEN LINE. ╫HEN THE SCREEN
  276. LINE YOU SPECIFIED GETS REDRAWN, THE INTERRUPT GOES OFF. ┘OUR CODE THEN QUICKLY
  277. CHANGES SOME MEMORY LOCATIONS TO CREATE A DIFFERENT VIDEO MODE OR EFFECT. ┘OU
  278. COULD CAUSE THE BOTTOM HALF OF THE SCREEN TO GETS IT'S CHARACTER DEFINITIONS
  279. FROM ANOTHER, DIFFERENT CHARACTER SET. ╧R, YOU COULD MAKE THE TOP 3/4 OF YOUR
  280. SCREEN EXIST IN HI-RES MULTI-COLOUR GRAPHICS, AND KEEP THE BOTTOM 1/4 OF THE
  281. SCREEN IN TEXT MODE.
  282.  
  283. ╙OME FACTS ABOUT THE VIDEO SCREEN: IT GETS REDRAWN EXACTLY 60 TIMES PER SECOND.
  284. ╔T CONTAINS 200 SCAN LINES ON THE NORMAL 25*40 DISPLAY, NUMBERED 50 TO 250 OR
  285. THEREABOUTS (NOTE THAT THERE ARE MORE VISIBLE SCAN LINES THOUGH: THE TOP AND
  286. BOTTOM BORDERS, FOR EXAMPLE). ╘HE ACTUAL RE-DRAWING OF THE SCREEN IS
  287. SYNCHRONIZED TO THE ELECTRICAL POWER COMING INTO YOUR HOUSE, 60 ╚Z. ╘HAT'S WHY
  288. SOME PROGRAMS BEHAVE DIFFERENTLY WHEN RUN ON ┼UROPEAN MACHINES. ╘HE POWER IS
  289. DELIVERED AT 50 ╚Z OVER THERE.
  290.  
  291. ╫HY DO WE HAVE TO WORRY ABOUT A VIDEO INTERRUPT? ╔F THE SCREEN GETS REDRAWN 60
  292. TIMES PER SECOND, AND REGULAR INTERRUPTS ALSO OCCUR AT 60 TIMES PER SECOND, WHY
  293. NOT SIMPLY PUT SOME CODE INTO THE REGULAR INTERRUPT TO DO WHAT WE WANT WITH THE
  294. SCREEN? ┬ECAUSE THE TWO TYPES OF INTERRUPTS ARE NOT IN SYNC. ╬EITHER ONE OF THEM
  295. OCCURS ┼╪┴├╘╠┘ 60 TIMES PER SECOND, AND THE DIFFERENCES ARE ENOUGH TO MAKE IT
  296. NEXT TO IMPOSSIBLE TO GET COORDINATED ACTIVITY OF ANY KIND HAPPENING ON THE
  297. SCREEN. ╫HEN WE USE THE VIDEO INTERRUPT, WE ╦╬╧╫ WE ARE AT A CERTAIN LINE ON THE
  298. SCREEN, AS BEING ON THAT LINE IS WHAT CAUSED THE INTERRUPT TO HAPPEN IN THE
  299. FIRST PLACE.
  300.  
  301. ╙O, LET'S SUMMARIZE. ╫E KNOW THAT REGULAR INTERRUPTS OCCUR 60 TIMES PER SECOND.
  302. ╫E ALSO KNOW THAT THE VIDEO SCREEN GETS RE-DRAWN 60 TIMES PER SECOND, AND THAT
  303. WE CAN CAUSE AN INTERRUPT TO BE GENERATED WHEN A CERTAIN LINE GETS DRAWN ON THE
  304. SCREEN. ╧NE SLIGHT DRAWBACK TO ALL OF THIS IS THAT ┬╧╘╚ TYPES OF INTERRUPTS
  305. (REGULAR AND RASTER DRIVEN) TRAVEL THROUGH THE ╙┴═┼ VECTOR (IE. ABOUT 120
  306. INTERRUPTS PER SECOND, 60 OF ONE, AND 60 OF THE OTHER). ┘OUR CODE WILL HAVE TO
  307. CHECK AND SEE WHAT THE SOURCE OF THE INTERRUPT WAS, AND ACT ACCORDINGLY. ╧R WILL
  308. IT?
  309.  
  310. ╘HE SYSTEM NEEDS AN INTERRUPT TO OCCUR 60 TIMES PER SECOND TO DO HOUSEKEEPING,
  311. AND USES THE ├╔┴ CLOCK TO GENERATE THE INTERRUPTS. ╫E WANT TO INTERRUPT EVERY
  312. TIME A CERTAIN SCAN LINE IS REACHED ON THE MONITOR, WHICH WILL ALSO JUST HAPPEN
  313. TO OCCUR AT 60 TIMES PER SECOND. ╫E ALSO HAVE TO MAKE SURE THAT THEY DON'T
  314. INTERFERE WITH EACH OTHER. ╘HE REGULAR INTERRUPTS SHOULD BE SENT TO THEIR ╥OM
  315. DESTINATION, WHILE OUR VIDEO INTERRUPTS SHOULD GO TO OUR CODE, AND NO WHERE
  316. ELSE.
  317.  
  318. ╔F BOTH ARE OCCURRING AT 60 TIMES PER SECOND, WHY NOT DO THE JOB OF THE SYSTEM
  319. ╥OM, AND OUR VIDEO CODE ON THE ╙┴═┼ INTERRUPT? ╫E KNOW THAT THE ├╔┴ CHIP IS NOT
  320. GOOD FOR THIS; IT IS OUT OF SYNC WITH THE VIDEO IMAGE. ╫HY NOT TURN ╧╞╞ THE ├╔┴
  321. INTERRUPT, ENABLE THE RASTER/VIDEO INTERRUPT, AND DO BOTH JOBS ON ONE INTERRUPT?
  322. ╘HEN WE WOULD HAVE AN INTERRUPT SIGNAL THAT OCCURS 60 TIMES PER SECOND, AND IS
  323. IN PERFECT SYNC WITH THE VIDEO IMAGE.
  324.  
  325. ╘HAT'S EXACTLY WHAT WE'RE GOING TO DO.
  326.  
  327. ┴STUTE READS WILL NOTICE A SLIGHT FLAW IN THE ABOVE LOGIC. ╞OR SIMPLIFICATION
  328. PURPOSES, ╔ DIDN'T GET INTO THE FACT THAT YOU WILL NEED ╘╫╧ RASTER INTERRUPTS
  329. ╨┼╥ ╙├╥┼┼╬ TO ACCOMPLISH ANYTHING USEFUL. ╫HY TWO? ┬ECAUSE ANY CHANGE TO THE
  330. VIDEO MODE YOU PUT INTO EFFECT 3/4 OF THE WAY DOWN THE SCREEN WILL HAVE TO BE
  331. UNDONE AT THE ╘╧╨ OF THE NEXT SCREEN UPDATE. ╔F YOU DECIDE TO MAKE THE TOP 3/4
  332. OF THE SCREEN A HI-RES IMAGE, AND THE BOTTOM 1/4 TEXT, YOU NEED ONE INTERRUPT
  333. 3/4 OF THE WAY DOWN THE SCREEN TO CHANGE FROM HI-RES TO TEXT, BUT YOU NEED A
  334. ╙┼├╧╬─ ONE AT THE TOP OF THE SCREEN TO CHANGE BACK TO HI-RES FROM TEXT.
  335.  
  336. ╙O, WE WILL NOW HAVE 120 INTERRUPTS GOING OFF EVERY SECOND TO ACCOMPLISH OUR
  337. VIDEO DESIRES, WITH 60 OF THEM WORKING A DOUBLE SHIFT, MAKING SURE THE SYSTEM
  338. INTERRUPT CODE GETS EXECUTED ALSO. ╥EMEMBER THAT WE ARE WORKING WITH A SPECIFIC
  339. EXAMPLE. ╘HERE IS NO REASON WHY YOU COULDN'T SPLIT THE SCREEN INTO ╬ DIFFERENT
  340. VIDEO MODES, AND HAVE (╬+1)*60 INTERRUPTS GOING OFF PER SECOND. ┴S LONG AS YOU
  341. KEEP YOUR CODE SHORT (SO YOUR INTERRUPTS DON'T TAKE TOO LONG, AND HAVE ANOTHER
  342. INTERRUPT OCCUR BEFORE THE CURRENT ONE IS DONE - MESSY), IT WILL WORK
  343. BEAUTIFULLY.
  344.  
  345. ╙O FAR, THIS IS ALL TALK. ╠ET'S WRITE A FEW SHORT CODE SEGMENTS TO ACCOMPLISH
  346. SOME OF THE FEATS WE'VE JUST DISCUSSED.
  347.  
  348. ╘HE FIRST WE'LL DO IS A RE-HASH OF THE ONE PRESENTED ABOVE. ╔T FLASHES THE
  349. BORDER AGAIN. ╔T DOES NOT DO ANY MID-SCREEN CHANGES OF VIDEO MODES OR ANYTHING
  350. FANCY LIKE THAT, SO ONLY 1 INTERRUPT PER SCREEN IS REQUIRED (IE. 60 PER SECOND,
  351. NOT 120 ETC.). ╘HIS PROGRAM SIMPLY SHOWS THE SAME IDEA, BUT THIS TIME USING
  352. VIDEO INTERRUPTS AS THE SOURCE RATHER THAN THE ├╔┴. ┘OU PROBABLY WON'T
  353. NOTICE A DIFFERENCE DURING EXECUTION.
  354.  
  355. ----------------------------------------------------------------------------
  356. ; FLASHER - PART ╔╔
  357. ;
  358. ; THIS PROGRAM CAUSES THE BORDER TO FLASH 60 TIMES PER SECOND
  359. ; THE SOURCE OF THE INTERRUPTS IS THE VIDEO CHIP
  360. ;
  361. SETUP = *
  362.  
  363. SEI                           ; DISABLE INTERRUPTS
  364.  
  365. LDA #$7F                      ; TURN OFF THE CIA INTERRUPTS
  366. STA $DC0D
  367.  
  368. LDA $D01A                     ; ENABLE RASTER IRQ
  369. ORA #$01
  370. STA $D01A
  371.  
  372. LDA $D011                     ; CLEAR HIGH BIT OF RASTER LINE
  373. AND #$7F
  374. STA $D011
  375.  
  376. LDA #100                      ; LINE NUMBER TO GO OFF AT
  377. STA $D012                     ; LOW BYTE OF RASTER LINE
  378.  
  379. LDA #>INTCODE                 ; GET LOW BYTE OF TARGET ROUTINE
  380. STA 788                       ; PUT INTO INTERRUPT VECTOR
  381. LDA #<INTCODE                 ; DO THE SAME WITH THE HIGH BYTE
  382. STA 789
  383. CLI                           ; RE-ENABLE INTERRUPTS
  384. RTS                           ; RETURN TO CALLER
  385.  
  386. INTCODE = *
  387.  
  388. INC $D020                     ; CHANGE BORDER COLOUR
  389.  
  390. LDA $D019                     ; CLEAR SOURCE OF INTERRUPTS
  391. STA $D019
  392.  
  393. LDA #100                      ; RESET LINE NUMBER TO GO OFF AT
  394. STA $D012
  395.  
  396. JMP $EA31                     ; EXIT BACK TO ROM
  397. --------------------------------------------------------------------------
  398.  
  399. ┴S YOU CAN TELL, THERE'S A WEE BIT MORE TO THIS CODE THAN THERE WAS IN THE
  400. ORIGINAL. ┼XECUTE IT, AND YOU'LL NOTICE THAT IT LOOKS PRETTY MUCH THE SAME AS
  401. THE RESULTS FROM THE FIRST PROGRAM. ┬UT THERE'S A DIFFERENCE: THE INTERRUPTS
  402. ARE NOW BEING GENERATED FROM THE VIDEO CHIP, NOT THE ├╔┴. ╞OR THIS PROGRAM, IT
  403. DIDN'T MAKE MUCH DIFFERENCE. ╚OWEVER, FOR A MORE COMPLICATED PROGRAM, IT MAKES
  404. A WORLD OF DIFFERENCE.
  405.  
  406. ╔'D BETTER EXPLAIN SOME OF THE CODE USED ABOVE:
  407.  
  408.      LDA #$7F
  409.      STA $DC0D
  410.  
  411.      - ╘HIS PIECE DISABLES ANY INTERRUPTS CAUSED BY THE ├╔┴ CHIP.
  412.  
  413.      LDA $D01A
  414.      ORA #$01
  415.      STA $D01A
  416.  
  417.      - ╠OCATION $D01A CONTROLS WHICH SOURCES MAY CAUSE AN INTERRUPT
  418.        (OTHER THAN THE NORMAL ├╔┴). ╘HERE ARE 4 DIFFERENT POSSIBLE
  419.        SOURCES: RASTERS, SPRITE TO SPRITE COLLISION, SPRITE TO
  420.        BACKGROUND COLLISION, AND THE LIGHT PEN. ┬IT #0 IS THE RASTER
  421.        BIT, AND THIS PIECE OF CODE ACTIVATES IT.
  422.  
  423.      LDA $D011
  424.      AND #$7F
  425.      STA $D011
  426.  
  427.      - ╘HIS CODE CLEARS BIT #7 OF LOCATION $D011. ╘HIS LOCATION IS USED
  428.        FOR MANY DIFFERENT THINGS. ┬IT #7 REPRESENTS THE HIGHEST BIT OF
  429.        THE RASTER LINE (SEE SEGMENT BELOW FOR MORE ON THE RASTER LINE
  430.        #). ═ORE THAN 256 RASTER LINE NUMBERS ARE POSSIBLE (SOME ARE OFF
  431.        SCREEN, AND SOME REPRESENT THE UPPER AND LOWER BORDER AREAS).
  432.        ╘HIS BIT IS THE 9TH BIT. ╔ SET IT TO ZERO BECAUSE ALL MY CODE
  433.        AFFECTS RASTERS ONLY ON THE NORMAL 25*40 LINE DISPLAY, WELL
  434.        WITHIN THE 0-255 RANGE. ╘HIS DECISION WAS AN ARBITRARY CHOICE ON
  435.        MY PART, TO MAKE THE CODE SIMPLER.
  436.  
  437.      LDA #100
  438.      STA $D012
  439.  
  440.      - ╠OCATION $D012 IS THE LOWER 8 BITS OF THE RASTER LINE ON WHICH
  441.        THE INTERRUPT IS TO BE GENERATED. ╘HE NUMBER 100 WAS ANOTHER
  442.        ARBITRARY CHOICE. ╞OR CHANGING BORDER COLOURS, THE ACTUAL LINE
  443.        NUMBER WAS NOT IMPORTANT. ╠ATER ON, IN THE NEXT EXAMPLE, IT WILL
  444.        BECOME IMPORTANT.
  445.  
  446.      LDA #>INTCODE
  447.      ...
  448.      RTS
  449.  
  450.      - ╥E-VECTORS THE INTERRUPT CODE TO THE NEW CODE.
  451.  
  452.      INC $D020
  453.  
  454.      - ├HANGES THE BORDER COLOUR.
  455.  
  456.      LDA $D019
  457.      STA $D019
  458.  
  459.      - ╘HESE LINES CLEAR THE BIT IN THE INTERRUPT REGISTER WHICH TELLS THE
  460.        SOURCE OF THE INTERRUPT (IN PREPERATION FOR THE NEXT).
  461.  
  462.      LDA #100
  463.      STA $D012
  464.  
  465.      - ╘HIS LINE RESETS THE RASTER LINE TO GO OFF AT LINE NUMBER 100
  466.        AGAIN (SAME AS ABOVE). ╔T SHOULD BE RESET, SO THE NEXT INTERRUPT
  467.        WILL KNOW WHAT LINE TO OCCUR ON.
  468.  
  469.      JMP $EA31
  470.  
  471.      - ┼XIT BACK TO THE ╦ERNAL ╥OM.
  472.  
  473.  
  474. ┴ ╒SEFUL ┼XAMPLE
  475. ----------------
  476.  
  477. ╘HE FOLLOWING IS AN EXAMPLE OF A MORE SOPHISTICATED PIECE OF RASTER CODE. ╔T
  478. MAKES THE TOP HALF OF THE SCREEN BORDER WHITE, AND THE BOTTOM HALF BLACK.
  479.  
  480. ---------------------------------------------------------------------------
  481. SETUP = *
  482.  
  483. ; SOME EQUATES
  484.  
  485. ├╧╠╧╒╥1 = 0
  486. ├╧╠╧╒╥2 = 1
  487. ╠╔╬┼1 = 20
  488. ╠╔╬┼2 = 150
  489.  
  490. ; CODE STARTS
  491.  
  492. SETUP = *
  493.  
  494. SEI                           ; DISABLE INTERRUPTS
  495.  
  496. LDA #$7F                      ; TURN OFF THE CIA INTERRUPTS
  497. STA $DC0D
  498.  
  499. LDA $D01A                     ; ENABLE RASTER IRQ
  500. ORA #$01
  501. STA $D01A
  502.  
  503. LDA $D011                     ; CLEAR HIGH BIT OF RASTER LINE
  504. AND #$7F
  505. STA $D011
  506.  
  507. LDA #╠╔╬┼1                    ; LINE NUMBER TO GO OFF AT
  508. STA $D012                     ; LOW BYTE OF RASTER LINE
  509.  
  510. LDA #>INTCODE                 ; GET LOW BYTE OF TARGET ROUTINE
  511. STA 788                       ; PUT INTO INTERRUPT VECTOR
  512. LDA #<INTCODE                 ; DO THE SAME WITH THE HIGH BYTE
  513. STA 789
  514.  
  515. CLI                           ; RE-ENABLE INTERRUPTS
  516. RTS                           ; RETURN TO CALLER
  517.  
  518. INTCODE = *
  519.  
  520. LDA MODEFLAG                  ; DETERMINE WHETHER TO DO TOP OR
  521.                               ; BOTTOM OF SCREEN
  522. BEQ MODE1
  523. JMP MODE2
  524.  
  525. MODE1 = *
  526.  
  527. LDA #$01                      ; INVERT MODEFLAG
  528. STA MODEFLAG
  529.  
  530. LDA #├╧╠╧╒╥1                  ; SET OUR COLOUR
  531. STA $D020
  532.  
  533. LDA #╠╔╬┼1                    ; SETUP LINE FOR ╬┼╪╘ INTERRUPT
  534. STA $D012                     ; (WHICH WILL ACTIVATE ═╧─┼2)
  535.  
  536. LDA $D019
  537. STA $D019
  538.  
  539. JMP $EA31                     ; ═╧─┼1 EXITS TO ╥OM
  540.  
  541. MODE2 = *
  542.  
  543. LDA #$00                      ; INVERT MODEFLAG
  544. STA MODEFLAG
  545.  
  546. LDA #├╧╠╧╒╥2                  ; SET OUR COLOUR
  547. STA $D020
  548.  
  549. LDA #╠╔╬┼2                    ; SETUP LINE FOR ╬┼╪╘ INTERRUPT
  550. STA $D012                     ; (WHICH WILL ACTIVATE ═╧─┼1)
  551.  
  552. LDA $D019
  553. STA $D019
  554.  
  555. PLA                           ; WE EXIT INTERRUPT ENTIRELY.
  556. TAY                           ; SINCE HAPPENING 120 TIMES PER
  557. PLA                           ; SECOND, ONLY 60 NEED TO GO TO
  558. TAX                           ; HARDWARE ╥OM. ╘HE OTHER 60 SIMPLY
  559. PLA                           ; END
  560. RTI
  561.  
  562. MODEFLAG .BYTE 0
  563.  
  564. ----------------------------------------------------------------------------
  565.  
  566. ╘HE ABOVE CODE, WHEN EXECUTED, WILL RESULT IN THE TOP HALF OF YOUR BORDER BEING
  567. WHITE, AND THE BOTTOM BLACK. ┘OU MAY WISH TO FIDDLE WITH THE EQUATES (├╧╠╧╒╥1,
  568. ├╧╠╧╒╥2, ╠╔╬┼1, AND ╠╔╬┼2) TO GET DIFFERENT EFFECTS.
  569.  
  570. ╔ SEE SOME CONFUSED FACES CONCERNING WHY THE ABOVE EXIT THE INTERRUPTS THE WAY
  571. THEY DO. ╥EMEMBER, SINCE WE WANT A SPLIT SCREEN EFFECT, WE HAVE TO HAVE ONE
  572. INTERRUPT OCCUR AT THE ╘╧╨ OF THE SCREEN, TO TURN ON THE ╫╚╔╘┼ EFFECT, AND ONE
  573. MIDWAY DOWN TO TURN ON THE ┬╠┴├╦ EFFECT. ╘WO INTERRUPTS TIMES 60 MEANS 120
  574. INTERRUPTS WILL BE EXECUTED PER SECOND. ╘HE ╥OM ONLY NEEDS 60 PER SECOND TO
  575. SERVICE THE KEYBOARD AND ITS OTHER STUFF. ╙O, WE SEND 60 TO THE ╥OM (THE
  576. INTERRUPTS WHICH GO THROUGH ═╧─┼1) BY ╩═╨ING TO $┼┴31, AND THE OTHER 60 WE
  577. TRASH. ╘HE ╨╠┴... ╥╘╔ BUSINESS IS THE PROPER WAY TO BRING AN INTERRUPT TO AN END
  578. WITHOUT GOING THROUGH THE ╥OM. ╘HE ╥╘╔ WILL ╥E╘URN FROM ╔NTERRUPT, AND CAUSE THE
  579. REGULAR PROGRAM TO CONTINUE TO EXECUTE.
  580.  
  581. ╘HAT BRINGS TO AN END THIS DISCUSSION ON RASTERS. ╔ HOPE THE ABOVE EXAMPLES
  582. HAVE PROVED TO BE A VALUABLE LEARNING TOOL FOR YOU. ╫ITH LUCK, THEY WILL
  583. MOTIVATE YOU TO CONTINUE TO EXPERIMENT WITH RASTERS, AND COME UP WITH SOME NEAT
  584. EFFECTS.
  585.  
  586. ╔F YOU HAVE ANY QUESTIONS, BE SURE TO ASK ME ABOUT THEM.
  587.  
  588. ==============================================================================
  589. ┬╒╥╙╘╔╬╟ ┘╧╒╥ 128: ╘╚┼ ╞┴╙╘╠╧┴─ ┬╒╥╙╘ ├╧══┴╬─
  590. BY ├RAIG ┬RUCE <F2RX@JUPITER.SUN.CSD.UNB.CA>
  591.  
  592. 1. ╔╬╘╥╧─╒├╘╔╧╬
  593.  
  594. ╘HIS ARTICLE DISCUSSES THE WELL-UNKNOWN ╞ASTLOAD COMMAND OF THE 1571 AND 1581
  595. DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET.  ╔F YOU LOOK IN THE BACK OF YOUR '71
  596. (OR '81 ╔ PRESUME) DISK DRIVE MANUAL, YOU WILL FIND THAT THE INFORMATION GIVEN
  597. ABOUT THE ╞ASTLOAD UTILITY IS NOT EXACTLY ABUNDANT.
  598.  
  599. ╘HE ╞ASTLOAD COMMAND WAS INTENDED TO LOAD PROGRAM FILES INTO MEMORY FOR
  600. EXECUTION, BUT IT CAN BE USED JUST AS WELL FOR READING THROUGH SEQUENTIAL
  601. FILES THAT WOULD BE MUCH TOO LARGE TO LOAD INTO A SINGLE BANK OF INTERNAL
  602. MEMORY.
  603.  
  604. ╘O MAKE USE OF THE ╞ASTLOAD BURST COMMAND, ╔ IMPLEMENT A WORD COUNTING UTILITY
  605. THAT WILL COUNT THE NUMBER OF LINES, WORDS, AND CHARACTERS IN A TEXT FILE ON A
  606. 1571 OR 1581 DISK DRIVE.  ╘HE ADVANTAGE OF USING THE ╞ASTLOAD COMMAND OVER
  607. REGULAR SEQUENTIAL FILE ACCESSING THROUGH THE KERNEL AND ─╧╙ IS THAT THE
  608. ╞ASTLOAD OPERATES ABOUT 3.5 TIMES FASTER ON BOTH DRIVES.
  609.  
  610. 2. ╫╧╥─ ├╧╒╬╘╔╬╟ ╒╘╔╠╔╘┘
  611.  
  612. ╘O USE THE WORD COUNTING PROGRAM, ╠╧┴─ AND ╥╒╬ IT LIKE A REGULAR ┬┴╙╔├
  613. PROGRAM.  ╔T WILL ASK YOU FOR THE NAME OF A FILE.  ┼NTER THE NAME IF IT IS ON
  614. DEVICE NUMBER 8, OR PUT A ONE CHARACTER PREFIX AND A ":" IF IT IS ON ANOTHER
  615. DEVICE.  ┴ "B" MEANS DEVICE 9, "C" DEVICE 10, ETC.  ╘HE FOLLOWING ARE EXAMPLES
  616. OF VALID NAMES:
  617.  
  618. . FILENAME          "FILENAME" ON DEVICE 8
  619. . B:FILENAME        "FILENAME" ON DEVICE 9
  620. . A:FILENAME        "FILENAME" ON DEVICE 8
  621.  
  622. ╘HE FILE MUST BE ON EITHER A 1571 OR 1581 DISK DRIVE; THE PROGRAM WILL NOT
  623. WORK WITH NON-BURST DEVICES.  ╘HE PROGRAM WILL WORK WITH EITHER ╨╥╟ OR ╙┼╤
  624. FILES, SINCE THE ╞ASTLOAD COMMAND CAN BE TOLD NOT TO WORRY ABOUT THE FILE
  625. TYPE.
  626.  
  627. ╔ USE THE SAME DEFINITION OF A WORD AS THE ╒NIX "WC" COMMAND USES: A SEQUENCE
  628. OF CHARACTERS DELIMITED BY WHITESPACE, WHERE WHITESPACE IS DEFINED TO BE
  629. ╙╨┴├┼, ╘┴┬, AND ╬┼╫╠╔╬┼ (├ARRIAGE ╥ETURN) CHARACTERS.  ╘O GET THE LINE COUNT,
  630. ╔ SIMPLY COUNT THE NUMBER OF ╬┼╫╠╔╬┼S.  ╔F THE LAST LINE OF THE FILE DOES NOT
  631. END WITH A ╬┼╫╠╔╬┼ CHARACTER, THEN THE COUNT WILL BE ONE LINE SHORT.  ╘HIS IS
  632. THE SAME AS THE ╒NIX WC COMMAND TOO.  ┴ PROPER TEXT FILE SHOULD HAVE ITS LAST
  633. LINE END WITH A ╬┼╫╠╔╬┼ CHARACTER.
  634.  
  635. ╧N MY ╩IFFY─╧╙-IFIED 1571 AND 1581, ╔ AM ABLE TO ACHIEVE A WORD COUNTING SPEED
  636. OF 5,400 CHARS/SEC AND 6,670 CHARS/SEC, RESPECTIVELY.  ╔ AM NOT SURE HOW MUCH
  637. OF A DIFFERENCE ╩IFFY─╧╙ MAKES, BUT ╔ AM NOT WILLING TO RIP OUT THE ╥╧═S TO
  638. CHECK.  ╔ TESTED USING A 318╦ FILE.
  639.  
  640. 3. ┬╒╥╙╘ ╥┼┴─ ╠╔┬╥┴╥┘
  641.  
  642. ╘HIS SECTION PRESENTS THE BURST READING LIBRARY THAT YOU CAN INCORPORATE INTO
  643. YOUR OWN PROGRAMS AND DESCRIBES HOW THE BURST COMMANDS WORK.  ╘HE LIBRARY HAS
  644. THREE CALLS:
  645.  
  646. . BURST╧PEN  ( .┴=─EVICE, .╪=╬AME╠EN, BURST┬UF=╞ILENAME ) : <FIRST BLOCK>
  647. . BURST╥EAD  () : BURST┬UF, BURST╙TATUS, BURST┬UF├OUNT
  648. . BURST├LOSE ()
  649.  
  650. ╔ DEFINE THREE COMMON STORAGE VARIABLES FOR USING THIS PACKAGE: "BURST┬UF",
  651. "BURST╙TATUS", AND "BURST┬UF├OUNT".  "BURST┬UF" IS A 256 BYTE AREA WHERE THE
  652. DATA READ IN FROM THE DISK DRIVE IS STORED BEFORE PROCESSING, AND IS LOCATED
  653. AT $0┬00.  "BURST╙TATUS" IS A ZERO-PAGE LOCATION THAT KEEPS THE STATUS
  654. RETURNED FROM THE BURST COMMAND SYSTEM.  ╘HIS IS NEEDED BY THE USER TO DETECT
  655. WHEN THE END OF FILE HAS BEEN ENCOUNTERED.  "BURST┬UF├OUNT" GIVES THE NUMBER
  656. OF DATA BYTES AVAILABLE IN "BURST┬UF" AFTER AN OPEN OR READ OPERATION.  ╔TS
  657. VALUE WILL BE SOMEWHERE BETWEEN 1 AND 254.  ┴ FULL SECTOR CONTAINS 254 BYTES
  658. OF DATA AND TWO BYTES OF CONTROL INFORMATION.
  659.  
  660. "BURST╙TATUS" AND "BURST┬UF├OUNT" ARE DEFINED TO BE AT LOCATIONS $╞┼ AND $╞╞,
  661. RESPECTIVELY.  ┘OU ARE ALLOWED TO ALTER THE VALUES OF THE TWO VARIABLES AND
  662. THE DATA BUFFER BETWEEN CALLS, IF YOU WISH.  ╞OR REASONS NOT COMPLETELY
  663. UNDERSTOOD, INTERRUPTS MUST BE DISABLED FOR THE ENTIRE COURSE OF BURST READING
  664. A FILE.  ╔ SUSPECT THIS IS BECAUSE THE ╔╥╤ SERVICE ROUTINE READS THE INTERRUPT
  665. MASK REGISTER OF ├╔┴#1, THUS CLEARING THE ╙ERIAL─ATA╥EADY FLAG THAT THE BURST
  666. READ ROUTINE WAITS FOR.  ┴NYWAY, THE OPEN ROUTINE DOES A ╙┼╔ AND THE CLOSE
  667. ROUTINE DOES A ├╠╔, SO YOU DON'T HAVE TO DO THIS YOURSELF.
  668.  
  669. ╔F AN ERROR OCCURS DURING THE EXECTION OF ONE OF THESE ROUTINES, IT WILL
  670. RETURN WITH THE CARRY FLAG SET AND WITH THE ERROR CODE IN THE .┴ REGISTER
  671. (SAME AS THE KERNEL (YES, ╔ KNOW THAT ├OMMODORE LIKES TO CALL IT THE
  672. "KERN┴L")).  ┼RROR CODES 0 TO 9 CORRESPOND TO THE STANDARD KERNEL CODES, ERROR
  673. CODE 10 MEANS THAT THE DEVICE IS NOT A BURST DEVICE, AND ERROR CODES 16 TO 31
  674. CORRESPOND TO THE BURST CONTROLLER STATUS CODES 0-15.  ╔F NO ERROR OCCURS, THE
  675. ROUTINES RETURN WITH THE CARRY FLAG CLEAR, OF COURSE.
  676.  
  677. ╧NLY ONE FILE MAY BE OPEN AT A TIME FOR ╞ASTLOADING, SINCE ╞ASTLOAD TAKES OVER
  678. THE DISK DRIVE AND THE ENTIRE SERIAL BUS.  ┼VEN REGULAR FILES CANNOT BE
  679. ACCESSED WHILE A FASTLOAD IS IN PROGRESS.  ╘HUS, ╞ASTLOAD IS NOT SUITABLE FOR
  680. ALL FILE PROCESSING APPLICATIONS, BUT IT WORKS VERY WELL FOR READING A FILE
  681. INTO MEMORY (LIKE FOR A TEXT EDITOR) AND FOR SUMMARIZATION OPERATIONS (LIKE
  682. WORD COUNTING).  ╘HE BURST LIBRARY REQUIRES THAT THE KERNEL AND ╔/╧ SPACE BE
  683. IN CONTEXT WHEN IT IS CALLED.
  684.  
  685. 3.1. ┬╒╥╙╘ ╧╨┼╬
  686.  
  687. ╘HE WAY THAT A BURST COMMAND IS GIVEN IS TO GIVE A MAGICAL INCANTATION OVER
  688. THE COMMAND CHANNEL TO THE DISK DRIVE.  ┘OU CAN EITHER USE THE LOW-LEVEL
  689. SERIAL BUS CALLS (╠╔╙╘╬, ╙┼├╬─, ├╔╧╒╘, AND ╒╬╠╙╬) OR USE THE ╧╨┼╬ AND ├╚╥╧╒╘
  690. CALLS.  ╔ USED THE LOW LEVEL CALLS FOR A LITTLE EXTRA ZIP.
  691.  
  692. ╘HE BURST COMMAND FORMAT FOR ╞ASTLOAD IS GIVEN IN THE BACK OF YOUR DRIVE
  693. MANUAL:
  694.  
  695. .  ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  696. . -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  697. .   0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  698. .   1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  699. .   2    ▄     ╨  ▄  ╪  ▄  ╪  ▄  1  ▄  1  ▄  1  ▄  1  ▄  1  ▄  159
  700. . 3 - ?? ▄                     <FILENAME>                   ▄
  701. . -------+--------------------------------------------------+-------
  702.  
  703. WHERE "╪" MEANS "DON'T CASE" AND "╨" MEANS "PROGRAM".  ╔F THE ╨ BIT IS '0'
  704. THEN ONLY PROGRAM (╨╥╟) FILES CAN BE LOADED, AND IF IT IS '1' THEN SEQUENTIAL
  705. (╙┼╤) FILES CAN BE LOADED AS WELL.  ╘HE PACKAGE AUTOMATICALLY SETS THIS FLAG
  706. FOR YOU.  ╬OTE THAT YOU DON'T HAVE TO DO AN ╔NQUIRE ─ISK OR ╤UERY ─ISK ╞ORMAT
  707. IN ORDER TO USE THIS COMMAND LIKE YOU HAVE TO DO WITH THE BLOCK READING AND
  708. WRITING COMMANDS.
  709.  
  710. ╔F YOU WANT TO TRY GIVING THE INCANTATION YOURSELF, ENTER:
  711.  
  712. ╧╨┼╬1,8,15,"╒0"+├╚╥$(159)+"╞╔╠┼╬┴═┼"
  713.  
  714. (WHERE "╞╔╠┼╬┴═┼" IS THE NAME OF SOME FILE THAT EXISTS ON YOUR DISK) ON YOUR
  715. 128 AND YOUR DISK DRIVE WILL SPRING TO LIFE AND WAIT FOR YOU TO READ THE FILE
  716. DATA.  ┘OU CAN'T READ THE DATA FROM ┬┴╙╔├, SO TO CANCEL THE COMMAND:
  717.  
  718. ├╠╧╙┼1
  719.  
  720. ╘HE "BURST╧PEN" CALL OF THIS PACKAGE ACCEPTS THE NAME OF THE FILE TO BE LOADED
  721. AT THE START OF THE "BURST┬UF" BUFFER, THE LENGTH OF THE FILENAME IN THE .╪
  722. REGISTER, AND THE DEVICE NUMBER TO LOAD THE FILE FROM IN THE .┴ REGISTER.  ╘HE
  723. BURST COMMAND HEADER AND THE FILENAME ARE SENT TO THE DISK DRIVE AS DESCRIBED
  724. ABOVE.
  725.  
  726. ╘HE OPEN COMMAND ALSO READS THE FIRST SECTOR OF THE FILE, FOR TWO REASONS.
  727. ╞IRST, THE STATUS BYTE RETURNED FOR THE FIRST SECTOR HAS SPECIAL MEANING.
  728. ╙TATUS CODE $02 MEANS "FILE NOT FOUND".  ╘HE PACKAGE TRANSLATES THIS INTO THE
  729. KERNEL ERROR CODE.  ╙ECOND, AND MOST IMPORTANT, THERE IS A BIZARRE FEATURE
  730. (READ: "BUG") IN THE ╞ASTLOAD COMMAND.  ╔F THE FILE TO BE READ IS ONLY ONE
  731. BLOCK LONG, THEN THE NUMBER OF BYTES REPORTED FOR THE BLOCK LENGTH IS TWO
  732. BYTES TOO SHORT.  ╘HE FOLLOWING TABLE GIVES THE NUMBER OF BYTES REPORTED AND
  733. THE NUMBER OF ACTUAL BYTES IN THE SECTOR:
  734.  
  735. . ┴CTUAL   ▄    4    ▄    3    ▄    2    ▄    1    ▄    0    ▄
  736. . ---------+---------+---------+---------+---------+---------+
  737. . ╥EPORTED ▄    2    ▄    1    ▄    0    ▄   255   ▄   255   ▄
  738.  
  739. ╘HIS IS WHERE ╔ RAN INTO PROBLEMS WITH ┌ED-128; THE LOGIC OF MY PROGRAM
  740. SCREWED UP ON A ZERO LENGTH.  ╔ HAVE CORRECTED THE PROBLEM HERE, THOUGH.  ╘HIS
  741. BUG IS BIZARRE BECAUSE IT ONLY HAPPENS IF THE FIRST SECTOR IS THE ONLY SECTOR
  742. IN THE FILE.  ╘HE REPORTED LENGTH FOR ALL SUBSEQUENT SECTORS IS CORRECT.  ╬OTE
  743. ALSO THAT 255 IS REPORTED FOR LENGTHS OF BOTH 1 AND 0.  ╘HIS IS BECAUSE THERE
  744. IS NO ACTUAL ZERO LENGTH FOR ├OMMODORE FILES.  ╔F YOU ╧╨┼╬1,8,2,"┼═╨╘┘" AND
  745. THEN IMMEDIATELY ├╠╧╙┼1 YOU GET A FILE WITH ONE CARRIAGE RETURN CHARACTER IN
  746. IT.
  747.  
  748. ╘HE OPEN ROUTINE CALLS THE READ ROUTINE TO READ A SECTOR AND IF IT WAS THE
  749. ONLY SECTOR OF THE FILE, THE TWO ADDITIONAL BYTES ARE BURST-READ AND PUT INTO
  750. THE DATA BUFFER.  ╬OTE THAT INCREMENTING THE REPORTED COUNT OF 255 TWICE GIVES
  751. THE CORRECT COUNT OF 1.  ┴LSO INTERESTING IN THIS CASE IS THAT WHEN THE
  752. 1571/81 REPORTS THE 255, IT ACTUALLY TRANSFERS 255 BYTES OF DATA, ALL OF WHICH
  753. ARE BOGUS.  ╔T SEEMS TO ME THAT THEY MADE THE 1581 BUG-COMPATIBLE WITH THE
  754. 1571 IN THIS RESPECT.
  755.  
  756. ╘HE OPEN ROUTINE ALSO EXECUTES A ╙┼╔ FOR REASONS DISCUSSED ABOVE.  ╘HE
  757. INFORMATION RETURNED BY THE OPEN CALL IS THE SAME AS WHAT IS RETURNED FOR THE
  758. "BURST╥EAD" CALL DISCUSSED NEXT.
  759.  
  760. 3.2. ┬╒╥╙╘ ╥┼┴─
  761.  
  762. ╧NCE THE ╞ASTLOAD COMMAND IS STARTED, THE DRIVE STARTS WAITING TO TRANSFER THE
  763. DATA TO YOU.  ╘HE TRANSFER OCCURS SECTOR BY SECTOR, WITH EACH SECTOR PRECEEDED
  764. BY A BURST STATUS BYTE.  ╘HE DATA IS TRANSFERRED USING THE SHIFT REGISTER OF
  765. ├╔┴#1 AND THE HANDSHAKING IS DONE USING THE ╙LOW ╙ERIAL ├LOCK LINE OF ├╔┴#2.
  766. ╘O RECEIVE A BYTE, YOU TOGGLE THE ╙LOW ╙ERIAL ├LOCK LINE AND WAIT FOR THE
  767. ╙HIFT ╥EGISTER ╥EADY SIGNAL FROM ├╔┴#1 AND THEN READ THE DATA VALUE FROM THE
  768. SHIFT DATA REGISTER.
  769.  
  770. ╧NE OF THE CLOCK REGISTERS IN THE ├╔┴ IN THE 1571/81 IS USED AS THE BAUD RATE
  771. GENERATOR FOR THE SERIAL LINE.  ╔ THINK THAT IT USES A DELAY OF 4 MICROSECONDS
  772. PER BIT, WHICH GIVES A BAUD RATE OF 250,000 (31.25╦/SEC).  ╔N MY
  773. EXPERIMENTATION, THE MAXIMUM BAUD RATE ╔ HAVE EVER ACHIEVED IN REALITY IS
  774. 200,000 (25╦/SEC).  ╔ READ IN MY 1571 ╔NTERNALS BOOK THAT THE 250,000 BAUD
  775. RATE CANNOT ACTUALLY BE ACHIEVED BECAUSE OF ELECTRICAL PROBLEMS THAT ╔ DON'T
  776. UNDERSTAND.  ╘HIS IS AN IMPORTANT DIFFERENCE BECAUSE THE DATA COMES FLYING OFF
  777. THE SURFACE OF THE DISK AT AROUND 30╦/SEC AND IF THE SERIAL BUS WERE FAST
  778. ENOUGH, IT COULD BE TRANSFERRED TO THE COMPUTER AS IT IS BEING READ.  ╙OME
  779. THINGS WOULD BE SO MUCH MORE CONVENIENT IF WHOMEVER CREATED THE UNIVERSE HAD
  780. THOUGHT TO MAKE LIGHT GO JUST A LITTLE BIT FASTER.
  781.  
  782. ╘HE BURST HANDSHAKING PROTOCOL SLOWS THE MAXIMUM TRANSFER RATE DOWN TO ABOUT
  783. 16╦/SEC.  ╧F COURSE, THE DISK DRIVE HAS MORE THINGS TO KEEP ON TOP OF THAN
  784. JUST TRANSFERRING DATA, SO THE ACTUAL BURST THROUGHPUT IS LOWER THAN THAT:
  785. ABOUT 5.4╦/SEC WITH MY ╩IFFY─╧╙-IFIED 1571 AND ABOUT 7╦/SEC WITH A 1581.  ╬OTE
  786. THAT YOU CAN PROBABLY INCREASE YOUR 1571'S BURST PERFORMANCE A BIT BY SETTING
  787. IT TO USE A SECTOR INTERLEAVE FACTOR OF 4, USING THE "╒0>╙"+├╚╥$(I) BURST
  788. COMMAND.  ┬Y DEFAULT, A 1571 WRITES FILES WITH AN INTERLEAVE OF 6.
  789.  
  790. ┴LL OF THE SECTORS BEFORE THE LAST ONE WILL CONTAIN 254 BYTES OF DATA AND THE
  791. LAST ONE WILL CONTAIN A SPECIFIED NUMBER OF BYTES, FROM 1 TO 254.  ╘HE STATUS
  792. CODE RETURNED FOR THE LAST SECTOR IS VALUE $1╞.  ╔N THIS CASE, AN ADDITIONAL
  793. BYTE IS SENT BEFORE THE DATA BYTES THAT TELLS HOW MANY DATA BYTES THERE WILL
  794. BE.  ╘HIS IS THE VALUE THAT IS BUGGED FOR ONE-SECTOR FILES AS DESCRIBED IN THE
  795. LAST SECTION.  ╞OR THOSE WHO LIKE PICTURES, HERE ARE DIAGRAMS OF THE DATA
  796. TRANSFERRED FOR A SECTOR:
  797.  
  798. .        ╥┼╟╒╠┴╥ ╙┼├╘╧╥                  ╠┴╙╘ ╙┼├╘╧╥ ╧╞ ╞╔╠┼
  799. .     +-------------------+             +--------------------+
  800. .   0 ▄ ┬URST ╙TATUS ┬YTE ▄           0 ▄ ┬URST ╙TATUS = $1╞ ▄
  801. .     +-------------------+             +--------------------+
  802. .   1 ▄                   ▄           1 ▄   ┬YTE ├OUNT = ╬   ▄
  803. . ... +  254 ─ATA ┬YTES   ▄             +--------------------+
  804. . 254 ▄                   ▄           2 ▄                    ▄
  805. .     +-------------------+         ... ▄    ╬ ─ATA ┬YTES    ▄
  806. .                                   ╬+1 ▄                    ▄
  807. .                                       +--------------------+
  808.  
  809. ╔F A SECTOR RETURNS A BURST STATUS CODE OTHER THAN 0 (OK) OR $1╞ (END), THEN
  810. AN ERROR HAS OCCURRED AND THE DISK DRIVE ABORTS THE TRANSFER, CLOSES THE BURST
  811. CONNECTION, AND STARTS THE DRIVE LIGHT BLINKING.
  812.  
  813. ╘HE "BURST╥EAD" CALL OF THIS PACKAGE READS THE DATA OF THE NEXT SECTOR OF THE
  814. OPENED FILE INTO THE "BURST┬UF" AND RETURNS THE "BURST╙TATUS" AND
  815. "BURST┬UF├OUNT" (BYTES READ).  ╔N THE EVENT OF AN ERROR OCCURING, THIS ROUTINE
  816. RETURNS WITH THE CARRY FLAG SET AND THE TRANSLATED BURST ERROR CODE IN THE .┴
  817. REGISTER (SAME AS BURST╧PEN).  ╫HEN THE LAST SECTOR OF THE FILE HAS JUST BEEN
  818. READ, THIS ROUTINE RETURNS WITH A VALUE OF $1╞ IN THE "BURST╙TATUS" VARIABLE.
  819.  
  820. 3.3. ┬╒╥╙╘ ├╠╧╙┼
  821.  
  822. ┴FTER READING THE LAST DATA BYTE OF THE LAST SECTOR OF THE FILE, THE BURST
  823. CONNECTION AND IS CLOSED AUTOMATICALLY BY THE DISK DRIVE.  ╘HE "BURST├LOSE"
  824. ROUTINE IS NOT NECESSARY FOR COMMUNICATION WITH THE DISK DRIVE, BUT IS
  825. PROVIDED FOR COMPLETENESS AND TO CLEAR THE INTERRUPT DISABLE BIT (├╠╔) THAT
  826. THE OPEN ROUTINE SET TO PREVENT INTERRUPTS WHILE BURST READING.
  827.  
  828.